#ifndef __COMM_HPP__
#define __COMM_HPP__

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "log.hpp"
using namespace std;

Log log;
const int size = 4096;
const string pathname = "/home/gmb_123";
const int proj_id = 0x6666; // 通过设置项目id，路径从而计算出唯一共享内存标识key
// 获取共享内存系统标识
key_t GetKey()
{
  key_t k = ftok(pathname.c_str(), proj_id); // 创建唯一标识
  if (k < 0)
  {
    log(Fatal, "ftok error:%s", strerror(errno)); // 创建失败
    exit(1);
  }
  log(Info, "ftok success,key if:0x%x", k); // 创建成功，输出标识
  return k;
}
// IPC_CREAT(单独)：如果使用的共享内存不存在，就创建，存在，就获取并返回，这个是用来获取共享内存
// IPC_CREAT|IPC_EXCL:如果申请的共享内存不存在，就创建，存在，就出错并返回,这个是用来创建共享内存
int GetshareMemHelper(int flag) // 参数是状态，看是创建还是获取，不同功能传递的参数不同
{
  key_t k = GetKey(); // 获取标识
  int shmid = shmget(k, size, flag);
  if (shmid < 0)
  {
    log(Fatal, "create share merory error:%s", strerror(errno));
    exit(2);
  }
  log(Info, "create share memory success,shmid:%d", shmid); // 这个是进程间识别唯一共享内存
  return shmid;
}

int CreateShm()
{
  return GetshareMemHelper(IPC_CREAT | IPC_EXCL | 0666);
}

int GetShm()
{
  return GetshareMemHelper(IPC_CREAT);
}
enum
{
  FIFO_CREATE_ERR = 1,
  FIFO_DELETE_ERR,
  FIFO_OPEN_ERR
};

// 下面是管道的创建，初始化

#define FIFO_FILE "./myfifo"
#define MODE 0664
class Init
{
public:
  Init()
  {
    // 创建管道
    int n = mkfifo(FIFO_FILE, MODE);
    if (n == -1)
    {
      perror("mkfifo");
      exit(FIFO_CREATE_ERR);
    }
  }
  ~Init()
  {

    int m = unlink(FIFO_FILE);
    if (m == -1)
    {
      perror("unlink");
      exit(FIFO_DELETE_ERR);
    }
  }
};
#endif